/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import clases.AlmacenArticulo;
import clases.Kardex;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
import modelo.Conexion;
import modelo.MdlKardex;

/**
 *
 * @author Edder
 */
public class CtrlKardex implements Controlador<Kardex>{
    private final MdlKardex mdlKardex;
    private final Conexion cnx;

    public CtrlKardex() {
        this.mdlKardex = new MdlKardex();
        this.cnx = Conexion.getConexionDefault();
    }
    
    /**
     *
     * @param objeto
     * @param cnx
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    @Override
    public void insert(Kardex objeto, Conexion cnx) throws SQLException, ClassNotFoundException {
        CtrlArticulo ctrlArticulo = new CtrlArticulo();
        int variacion = (objeto.getMovimiento() == 'E')? objeto.getCantidad() * -1: objeto.getCantidad();
        if(cnx == null){
            this.cnx.abrirConexion();
            this.cnx.abrirTransaccion();
            this.mdlKardex.insert(objeto, this.cnx);
            objeto.setIdKardex(this.mdlKardex.getLastId(this.cnx));
            ctrlArticulo.updateStock(objeto.getAlmacenArticulo().getIdAlmacenArticulo(), variacion, this.cnx);
            this.cnx.cerrarTransaccion();
            this.cnx.cerrarConexion();
        }else{
            this.mdlKardex.insert(objeto, cnx);
            objeto.setIdKardex(this.mdlKardex.getLastId(cnx));
            ctrlArticulo.updateStock(objeto.getAlmacenArticulo().getIdAlmacenArticulo(), variacion, cnx);
        }
    }
    
    public void insert(int idAlmacenArticulo, char movimiento, int cantidad, LocalDate fecha, Conexion cnx) throws SQLException, ClassNotFoundException {
        Kardex kardex = new Kardex(
                -1, 
                new AlmacenArticulo(){
                    {
                        this.setIdAlmacenArticulo(idAlmacenArticulo);
                    }
                },
                movimiento,
                cantidad,
                fecha);
        this.insert(kardex, cnx);
    }

    /**
     *
     * @param objeto
     * @param cnx
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    @Override
    public void update(Kardex objeto, Conexion cnx) throws SQLException, ClassNotFoundException {
        if(cnx == null){
            this.cnx.abrirConexion();
            this.mdlKardex.update(objeto, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            this.mdlKardex.update(objeto, cnx);
        }
    }

    /**
     *
     * @param id
     * @param cnx
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    @Override
    public Kardex get(int id, Conexion cnx) throws SQLException, ClassNotFoundException {
        Kardex kardex;
        if(cnx == null){
            this.cnx.abrirConexion();
            kardex = this.mdlKardex.get(id, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            kardex = this.mdlKardex.get(id, cnx);
        }
        return kardex;
    }
    
    /**
     *
     * @param fechaInicio
     * @param fechaFin
     * @param idAlmacen
     * @param idArticulo
     * @param cnx
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public ArrayList<Kardex> getKardex_fechas(String fechaInicio, String fechaFin, 
            int idAlmacen, int idArticulo, Conexion cnx) throws SQLException, ClassNotFoundException{        
        ArrayList<Kardex> kardexs;
        if(cnx == null){
            this.cnx.abrirConexion();
            kardexs = this.mdlKardex.getKardex_fechas(fechaInicio, fechaFin, idAlmacen, idArticulo, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            kardexs = this.mdlKardex.getKardex_fechas(fechaInicio, fechaFin, idAlmacen, idArticulo, cnx);
        }
        return kardexs;
    }
}
